# Spring Data JPA sort 多属性排序

spring data for jpa 中,存在一个pageable接口,是对查询分页的一个利器。

pageable实现类的构造方法中有个Sort参数,可以按照列属性进行排序。通过查看Sort类的构造方法,我们对Sort这个类进行一下分析,Sort类中存在以下几个构造方法:

  1. public Sort(Order… orders);
  2. public Sort(List orders);
  3. public Sort(String… properties);
  4. public Sort(Direction direction, String… properties);
  5. public Sort(Direction direction, List properties);

Direction是用来标识按照列属性升序还是降序排序的。 properties为列属性。

方法 3 只是输入列属性,按照默认的排序方式(ASC)

方法 4、5 只能够实用一种排序方向,我们要排列的多个属性都是升序或都是降序

方法 1 和 2,性质相同,可以实现多个列属性的不同方向排序,例如需要实现一个形如下面的 sql:

select * from table where a='a' and b='b' order by c desc,d asc,e desc;
1

这个Order一定要是import org.springframework.data.domain.Sort.Order;这个包下面的。 建立三个order分别为如下:

List< Order> orders=new ArrayList< Order>();
Order order2 = new Order(Direction.DESC, "age");
Order order3 = new Order(Direction.ASC, "pgrade");
Order order = new Order(Direction.DESC, "dnum");
1
2
3
4

先把这三个order放到list里面然后把list放到sort里面。

添加到list中的先后直接关联着排序的优先级,如下:

list.add(order2);
list.add(order3);
list.add(order);
Sort sort1 = new Sort(list);
1
2
3
4

生成需要的pageable

Pageable pageable= new PageRequest(pageNumber, pageSize, new Sort(orders));
1

springboot 2.x 使用:

Pageable pageable= PageRequest.of(pageNumber, pageSize, new Sort(orders));
1

复杂查询JpaSpecificationExecutor,可用:

query.orderBy(criteriaBuilder.desc(root.get("age").as(Integer.class)), criteriaBuilder.desc(root.get("id").as(Integer.class)));
1

使用此排序规则,如果pageablesort则会以 pageable 为准

如不分页,可直接使用 Sort;